/*
 * Controlador.h
 *
 *  Created on: 24/11/2011
 *      Author: Arthur Holanda
 */

#ifndef CONTROLADOR_H_
#define CONTROLADOR_H_

#include "model/Jogador.h"
#include "model/Baralho.h"
#include "model/Mao.h"
#include "model/Acao.h"
#include "controller/IListenerControlador.h"
#include "db/DatabaseManager.h"

#define MAX_JOGADORES 4

using namespace Osp::Base::Collection;

class Jogador;
class IListenerControlador;

class Controlador {
public:
	Controlador();
	virtual ~Controlador();
	void Construct();

	void SetJogador(Jogador* jogador);
	Jogador* GetJogador();
	Baralho* GetBaralho();
	Mao* GetMesa();
	static Controlador* GetInstance();

	int GetMaiorApostaRodada();
	int GetApostaAcumulada();
	void SetMaiorApostaRodada(int aposta);

	void InicioPartida();
    void DarCartasJogadores();
    void SolicitarBlind();
    void RecebeuBlinds();
    void InicioRodadaDeAposta();
    void InicioJogadaDaVez();
    void JogadorJogou(Acao *acao);
    void ProximoJogador();
    bool RodadaPodeTerminar();
    void FimRodadaAposta();
    void PagaVencedor();
    void FimPartida();

    void ProximoDealer();
    Jogador *GetDealer();
    int GetPosicaoDealer();
    Jogador *GetJogadorDaVez();
    int GetPosicaoJogadorDaVez();
    Jogador *GetJogador(int posicao);
    void AdicionarJogador(Jogador *jogador);
    void RemoverJogador(int posicao);
    int QuantidadeJogadoresJogando();
    int GetBlind();
    void SetBlind(int blind);

    void AddJogadores(int qtd);

    void SetListener(IListenerControlador* listener);
protected:
    static Controlador *controlador;
    IListenerControlador *listener;
    Baralho *baralho;
    Mao *mesa;
    int dealer;
    int jogadorDaVez;
    Jogador *jogadores[MAX_JOGADORES];
    int quantidadeJogadores;
    int maiorApostaRodada;
    int donoMaiorAposta;
    int apostaAcumulada;
    int blind;

private:
    DatabaseManager* db;
    ArrayList* nomesViaveis;

    void ColocarCartaNaMesa();
    String RecuperaNome();
    bool ExisteJogador(String nome);
};

#endif /* CONTROLADOR_H_ */
